/*
 * editorPerfil.h
 *
 *  Created on: 15/01/2011
 *      Author: julian
 */

#ifndef EDITORPERFIL_H_
#define EDITORPERFIL_H_

#include "bezier.h"
#include "mapa.h"
#include <vector>
#include "coord.h"

class editorPerfil {
private:
	Bezier* perfil;
	Mapa* terreno;
	vector<Coord>* coordenadas;
public:
        editorPerfil(Mapa* terreno){
           //CONTRUCCIOND DE LA Bezier (perfil inicial)
           std::vector<Coord> puntosControlBezier(4);
           puntosControlBezier[0].set(1,   0, 2);
           puntosControlBezier[1].set(2,   0, 1.5); 
           puntosControlBezier[2].set(2.5, 0, 1); 
           puntosControlBezier[3].set(3,   0, 0.5);

           this->perfil = new Bezier(puntosControlBezier);
           this->terreno = terreno;
           this->coordenadas = new vector<Coord>();
           this->terreno->establecerPerfil(perfil);
        }

        void agregarCoordenada(Coord coordenada){
           float nuevoX = 3*coordenada.x();
           float nuevoY = 0.0;
           float nuevoZ = 3*(1.0 - coordenada.y());
           Coord nuevaCoord;
           nuevaCoord.set(nuevoX, nuevoY, nuevoZ);
           coordenadas->push_back(nuevaCoord);
        }

        void definirPerfil(){
           if ((coordenadas->size()>3)&&(Bezier::satisfacePrecond(coordenadas->size()))){
              Bezier* nuevoPerfil = new Bezier(*coordenadas);
              delete perfil;
              perfil = nuevoPerfil;
              terreno->establecerPerfil(perfil);
              coordenadas->erase(coordenadas->begin(),coordenadas->end());
           }
        }

        void dibujarPanelPerfil(){
           glPushAttrib(GL_ALL_ATTRIB_BITS);
           float paso = 0.05;
           //Dibujado de las curvas
           glBegin(GL_LINE_STRIP);
           glColor3f(1.0,1.0,1.0);
           for(float i=0.0; i<=1; i+=paso){
              Coord v = perfil->operator ()(i);
              float normX = v.x()/3;
              float normY = v.z()/3;
              glVertex2f(normX,normY);
           }
           glEnd();
           //Dibujado de los puntos de control del perfil actual
           glPointSize(5);
           glBegin(GL_POINTS);
           glColor3f(1.0,0.0,0.0);
           vector<Coord> puntos = perfil->getPuntosControl();
           for(unsigned int i = 0; i<puntos.size(); i++){
              Coord coords = puntos[i];
              float coordX = coords.x()/3;
              float coordY = coords.z()/3;
              glVertex2f(coordX,coordY);
           }
           glEnd();
           //Dibujado de los puntos de control de edicion
           glBegin(GL_POINTS);
           glColor3f(0.0,0.0,1.0);
           for(unsigned int i = 0; i<(*coordenadas).size(); i++){
              Coord coords2 = (*coordenadas)[i];
              float coordX = coords2.x()/3;
              float coordY = coords2.z()/3;
              glVertex2f(coordX,coordY);
           }
           glEnd();
           glPopAttrib();
        }

        virtual ~editorPerfil(){
           delete perfil;
           delete coordenadas;
        }
};

#endif /* EDITORPERFIL_H_ */
